package com.cloud.order.controller;

import com.cloud.dto.CartDto;
import com.cloud.input.ProductInfoOutput;
import com.cloud.product.ProductClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

/**
 * describe:
 *
 * @author zhanghaixuan
 * @date 2018/09/11
 **/
@Slf4j
@RestController
@RequestMapping("/test")
public class ClientController {

    @Autowired
    private ProductClient productClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    /**
     * 第一种http获取参数方式
     * 直接使用 restTemplate 获取
     */
    @GetMapping("/getProductMsg1")
    public void getProductMsg1(){
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject("http://localhost:8080/test/msg", String.class);
        log.info("第一种方式获取的参数:{}",forObject);
    }

    /**
     * 第二种方式
     * 先使用 loadBalancerClient 获取地址
     * 再 使用 restTemplate
     */
    @GetMapping("/getProductMsg2")
    public void getProductMsg2(){

        ServiceInstance product = loadBalancerClient.choose("PRODUCT");

        String url = String.format("http://%s:%s", product.getHost(), product.getPort());

        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject(url+"/test/msg", String.class);
        log.info("第二种方式获取的参数:{}",forObject);
    }

    /**
     * 第三种http获取参数方式
     * @LoadBalanced 使用 @LoadBalanced 的resttemplate
     */
    @GetMapping("/getProductMsg3")
    public void getProductMsg3(){
        String forObject = restTemplate.getForObject("http://PRODUCT/test/msg", String.class);
        log.info("第三种方式获取的参数:{}",forObject);
    }

    /**
     * 第四种调用方法
     * 使用spring cloud feign 组件进行远程调用
     */
    @GetMapping("/getProductMsg4")
    public void getProductMsg4(){
        String msg = productClient.getMsg();
        log.info("第四种方式获取的参数:{}",msg);
    }


    @GetMapping("/getProductListByIds")
    public String getProductListByIds(){
        List<ProductInfoOutput> productByIds = productClient.findProductByIds(Arrays.asList("157875196366160022", "157875227953464068"));
        log.info("获取的产品列表:{}",productByIds);
        return "ok";
    }

    @GetMapping("/decreaseStock")
    public String decreaseStock(){
        List<CartDto> cartDtos = Arrays.asList(new CartDto("157875196366160022", 2));

        productClient.decreaseStock(cartDtos);

        return "ok";
    }
}
